Search code examples
javapythonhttprequestbounding-box

Why do I respond an Internal server error with status code 500 with a java post-request?


Hey I am new here in StackOverFlow

Actually I am trying to get data from an official database(https://emf2.bundesnetzagentur.de/karte/Default.aspx). I use java and try to get the information with a post request with parameters. I wrote two different versions, one with the Apache httpclient and one with java.net. I also have a version written in Python(not mine)

The one in java doesn't work! I get at least this error as response:

Statuscode: 500 Internal Server Error
{"d":{"Message":"Fehler bei der Suche nach Funkanlagenstandorten.","StackTrace":"","Source":"","InnerException":""}}


System.InvalidOperationException: 'GetStandorteFreigabe' ist kein gültiger Webdienst-Methodenname. bei System.Web.Services.Protocols.HttpServerProtocol.Initialize() bei System.Web.Services.Protocols.ServerProtocolFactory.Create(Type type, HttpContext context, HttpRequest request, HttpResponse response, Boolean& abortProcessing)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.CookieStore;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.client.HttpClientBuilder;
import org.json.simple.JSONObject;

import objects.BoundingBox;
import objects.Header;

public class HttpClientTest
{
    // TODO Größe der Bounding Box?
    public static void main(String[] args)
    {
       try
       {
          new HttpClientTest();
       }
       catch (IOException e)
       {
          e.printStackTrace();
       }
    }

    Header header;

    @SuppressWarnings("unchecked")
    public HttpClientTest() throws ClientProtocolException, IOException
    {
       List<BoundingBox> boxes = getBboxes();
       for (BoundingBox bBox : boxes)
       {
          HttpClient client = null;
          CookieStore cookieStore = new BasicCookieStore();
          HttpClientBuilder builder = HttpClientBuilder.create().setDefaultCookieStore(cookieStore);
          client = builder.build();

          String cookie = getCookie();
          HttpPost postRequest = new HttpPost(
                "https://" + Start.EMF + ".bundesnetzagentur.de/karte/Standortservice.asmx/GetStandorteFreigabe");
          header = new Header().getDefaultHeader();
          header.add("Cookie", cookie);
          Set<String> entries = header.keySet();
          for (String key : entries)
             postRequest.addHeader(key, header.get(key));

          // Request parameters and other properties.
          JSONObject obj = new JSONObject();
          JSONObject subObj = new JSONObject();
          subObj.put("sued", bBox.getSouth());
          subObj.put("west", bBox.getWest());
          subObj.put("nord", bBox.getNorth());
          subObj.put("ost", bBox.getEast());
          obj.put("Box", subObj);
          System.out.println("RequestJSON: " + obj.toJSONString());

          StringEntity requestEntity = new StringEntity(obj.toJSONString());
          requestEntity.setContentEncoding("UTF-8");
          requestEntity.setContentType("application/json");
          postRequest.setEntity(requestEntity);

          // Execute and get the response.
          HttpResponse response = client.execute(postRequest);
          System.out.println(response.getStatusLine());
          System.out.println(Arrays.deepToString(response.getAllHeaders()));

          HttpEntity entity = response.getEntity();
          if (entity != null)
          {
             StringBuilder sb = new StringBuilder();
             try (InputStream instream = entity.getContent())
             {
                BufferedReader reader = new BufferedReader(new InputStreamReader(instream));
                for (String line; (line = reader.readLine()) != null;)
                {
                    sb.append(line + "\r\n");
                }

                reader.close();
                // do something useful
             }
             System.out.println(sb.toString());
          }
       }

    }

    private String getCookie()
    {
       StringBuilder cookieStringBuilder = new StringBuilder();
       try
       {
          HttpClient client = null;
          CookieStore cookieStore = new BasicCookieStore();
          HttpClientBuilder builder = HttpClientBuilder.create().setDefaultCookieStore(cookieStore);
          client = builder.build();
          HttpGet httpGet = new HttpGet("https://" + Start.EMF + ".bundesnetzagentur.de/karte/Default.aspx");
          client.execute(httpGet);
          cookieStore.getCookies().forEach(e ->
             {
                cookieStringBuilder.append(e.getName() + " = " + e.getValue());
                cookieStringBuilder.append(";");
             });

       }
       catch (IOException e1)
       {
          e1.printStackTrace();
       }

       System.out.println("Cookie: " + cookieStringBuilder.toString());
       return cookieStringBuilder.toString();
    }

    private List<BoundingBox> getBboxes()
    {
//     BoundingBox box = new BoundingBox();
       BoundingBox box = new BoundingBox(13.679351806640627, 51.06313741319562, 13.723812103271484,
             51.082174834773625);
       List<BoundingBox> bBoxes = new ArrayList<>();
       bBoxes.add(box);
//     double south, west, north, east;
//     south = box.getSouth();
//
//     while (south <= box.getNorth())
//     {
//        north = south + JavaDefaultTest.STEP;
//        west = box.getWest();
//        while (west <= box.getEast())
//        {
//           east = west + JavaDefaultTest.STEP;
//           bBoxes.add(new BoundingBox(west, south, east, north));
//           west += JavaDefaultTest.STEP;
//        }
//        south += JavaDefaultTest.STEP;
//     }
       return bBoxes;
    }
}

BoundingBox:

package objects;

import java.util.ArrayList;
import java.util.List;

/**
 * order: west, south, east, north
 * 
 * @author Zinke
 *
 */
public class BoundingBox
{
    public final static double STEP = 0.03d;
    private double north;
    private double east;
    private double west;
    private double south;

    private static final double northMin = 47.0f, northMax = 55.0f;
    private static final double eastMin = 5.0f, eastMax = 16.0f;

    /**
     * <b>Initial constructor</b><br>
     * <br>
     * Bounding box for data scraping: Germany<br>
     * coordiantes in decimal degree<br>
     * <br>
     * order: west, south, east, north
     */
    public BoundingBox()
    {
       setWest(eastMin);
       setSouth(northMin);
       setEast(eastMin + STEP);
       setNorth(northMin + STEP);
    }

    /**
     * Bounding box for data scraping: Germany<br>
     * coordiantes in decimal degree<br>
     * order: west, south, east, north
     * 
     * @param west
     * @param south
     * @param east
     * @param north
     */
    public BoundingBox(double north, double east,double south,double west)
    {
       setWest(west);
       setNorth(north);
       setEast(east);
       setSouth(south);
    }

    public double getNorth()
    {
       return north;
    }

    public void setNorth(double north)
    {
       this.north = north;
    }

    public double getEast()
    {
       return east;
    }

    public void setEast(double east)
    {
       this.east = east;
    }

    public double getWest()
    {
       return west;
    }

    public void setWest(double west)
    {
       this.west = west;
    }

    public double getSouth()
    {
       return south;
    }

    public void setSouth(double south)
    {
       this.south = south;
    }

    /**
     * Returns a list with bounding boxes for whole germany <br>
     * From Southest+Westest Point beginning
     * 
     * @return
     */
    public static List<BoundingBox> getAllBboxes()
    {
       BoundingBox box = new BoundingBox();
       List<BoundingBox> bBoxes = new ArrayList<>();
       bBoxes.add(box);// set Starting Box

       double south, west, north, east;
       south = box.getSouth();
       while (south <= northMax)
       {
          north = south + BoundingBox.STEP;
          west = box.getWest();
          while (west <= eastMax)
          {
             east = west + BoundingBox.STEP;
             bBoxes.add(new BoundingBox(north,east,south,west));
             west += BoundingBox.STEP;
          }
          south += BoundingBox.STEP;
       }
       return bBoxes;
    }
}

Can somebody please help me?


Solution

  • Your code seems to work. I just tried it and only changed the coordinates value provided in your sample with some extracted from my browser debug console and it works:

    {"nord":51.7151177895987,"ost":12.70294189453125,"sued":9.857482910156252,"west":50.49770501038011}

    My guess is that you should ensure that there is no mistake in your BoundingBox class and that the range of each coordinate values is appropriate.