Search code examples
javaiospostrequestnsmutableurlrequest

What's wrong when i transfer the java code to iOS code about connecting to the server and get result?


The java code is below,It's about to connect to the server and get some information, you can run the java code and get {"carrier":{"CFeeC":1,"COrderC":1,"CTaskC":1,"flag":1},"driver":{"DTaskC":1,"DTraceR":1,"flag":1},"userinfo":{"czBizOrgId":"30500002049","czWebOrgId":545587,"hzBizOrgId":"30500000857","hzWebOrgId":545593,"userEmail":"all@1.com","userId":545566,"userName":"all all all"},"return_code":"00","customer":{"flag":1,"hFeeC":1,"hOrderA":1,"hOrderC":1,"hOrderS":1,"hPlanM":1,"hPlanS":1}}null

but when i run iOS code blew the java code,answer is {"exception":"Authenticated access required"} it seems that tha parameter that i send ,the server didn't get?why?

    public static void main(String[] args) {
    System.out.println(test());
}

private static String test() {
    String username = "all@1.com";
    String password = "1";

        String path = new String("http://61.174.31.28:9091/api/jsonws/UnicomWL-portlet.tcdcolligate/user-login/password/1/email/all%401.com"); // ƴ�����URL��ַ
        //path = path.replace("+","%20");

    try {
        String authString =username + ":" +password;
        String authStringEnc = new String(Base64.encode(authString.getBytes()));
        URL url = new URL(path);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("POST");
        connection.setDoOutput(true);
        connection.setRequestProperty("Authorization", "Basic " + authStringEnc);

        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(
                connection.getOutputStream());

        bufferedOutputStream.flush();
        bufferedOutputStream.close();

        if (connection.getResponseCode() != 200) {
            throw new RuntimeException("ResponseCode != 200");
        }
        BufferedInputStream bufferedInputStream = new BufferedInputStream(
                connection.getInputStream());
        int bytesRead = 0;

        byte[] buffer = new byte[1024];

        while ((bytesRead = bufferedInputStream.read(buffer)) != -1) {


            String chunk = new String(buffer, 0, bytesRead);
            System.out.print(chunk);
        }
        connection.disconnect();
    }
    catch (Exception e) {
    }


    return  null;

but when i tried used iOS ,it's wrong ,what's the matter? thank you

    int main(int argc, const char * argv[]) {
@autoreleasepool {
    // insert code here...
    NSLog(@"Hello, World!");

    NSData *authData=[@"all@1.com:1" dataUsingEncoding:NSUTF8StringEncoding];
    NSString *authStringEnc=[authData base64EncodedStringWithOptions:0];
    NSString *auth=[NSString stringWithFormat:@"Basic +%@",authStringEnc];
    NSLog(@"%@\n",auth);

    NSString *path=@"http://61.174.31.28:9091/api/jsonws/UnicomWL-portlet.tcdcolligate/user-login/password/1/email/all%401.com";

    NSURL *url=[NSURL URLWithString:path];
    NSMutableURLRequest *request=[[NSMutableURLRequest alloc] initWithURL:url];
    NSData *returnData=[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    NSString *s=[[NSString alloc]initWithData:returnData encoding:NSUTF8StringEncoding];
    NSLog(@"%@",s);

}
return 0;

}


Solution

  • You need to do something like this:

    NSString *authStr = [NSString stringWithFormat:@"%@:%@", @"username", @"password"];
    NSData *authData = [authStr dataUsingEncoding:NSUTF8StringEncoding];
    NSString *authValue = [NSString stringWithFormat:@"Basic %@", [authData base64Encoding]];
    [request setValue:authValue forHTTPHeaderField:@"Authorization"];
    

    Here is a sample project that worked. sample